package ar.uba.fi.tonyvaliente.signature;

/**
 * En realidad es half & Square por como está implementada, pero el principio es 
 * similar, se toman 6 bytes del string recibido y se lo eleva al cuadrado.
 * Su distribución es bastante buena, en promedio, de cada 100 claves colisionan 20.
 * 
 * @author santiago
 *
 */
public class SqrAndHalf extends HashFunction {

	public SqrAndHalf(int length) {
		super(length);
	}

	@Override
	public Number hash(String data) throws HashFunctionException {

		Long numberKey = 0L;
		
		Long hashValue = 0L;
		
		StringBuffer value = new StringBuffer();
		
		byte[] bytes = data.getBytes();

				
		for (int i = 0, j = 0; i < bytes.length && j < 6; i++) {
		
			if(i%2 != 0){
				byte b = bytes[i];
				value.append(Math.abs(b));
				j++;
			}
		}

		if(value.length() > 0){
			hashValue = (new Long(value.toString())*this.getSeed());
		}else{
			hashValue = new Long(this.getSeed());
		}
		
		Double sqrNumberKey = Math.pow(hashValue, 2);
		numberKey = Math.round(sqrNumberKey%this.getLength());
		return numberKey;
	}

}
